package com.itheima.book.utils;

import com.itheima.model.book.vos.CategoryTreeVo;
import com.itheima.model.book.pojos.Category;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * 分类树组装工具类
 */
public class CategoryTreeBuilder {

    /**
     * 将扁平分类列表转换为树形结构
     * @param categoryList 所有分类的扁平列表
     * @return 根节点（一级分类）的树形列表
     */
    public static List<CategoryTreeVo> buildTree(List<Category> categoryList) {
        // 1. 转换为Vo并按parentId分组（便于快速查找子节点）
        Map<Integer, List<CategoryTreeVo>> parentMap = categoryList.stream()
                .map(CategoryTreeVo::new).
        collect(Collectors.groupingBy(CategoryTreeVo::getParentId));

        // 2. 递归为每个节点设置子节点
        List<CategoryTreeVo> rootNodes = parentMap.getOrDefault(0, new ArrayList<>());
        rootNodes.forEach(node -> setChildren(node, parentMap));

        // 3. 按sort排序（可选，保证展示顺序）
        return rootNodes.stream()
                .sorted((n1, n2) -> Integer.compare(n1.getSort(), n2.getSort()))
                .collect(Collectors.toList());
    }

    /**
     * 递归为节点设置子节点
     * @param node 当前节点
     * @param parentMap 按parentId分组的所有节点
     */
    private static void setChildren(CategoryTreeVo node, Map<Integer, List<CategoryTreeVo>> parentMap) {
        // 获取当前节点的子节点（parentId = 当前节点id）
        List<CategoryTreeVo> children = parentMap.getOrDefault(node.getId(), new ArrayList<>());
        
        // 对子节点排序并设置
        children.sort((c1, c2) -> Integer.compare(c1.getSort(), c2.getSort()));
        node.setChildren(children);
        
        // 递归处理子节点的子节点
        children.forEach(child -> setChildren(child, parentMap));
    }
}